﻿
using Protocol.SouthGridProtocol.Blocks;
using Protocol.SouthGridProtocol.Decoder;
using Protocol.SouthGridProtocol.Encoder;
using PacoToolKit.Format;
namespace Protocol.SouthGridProtocol.Model
{
    public class C02H
    {
        public string c;
        public string concentrator;
        public string addressDomain;
        public string seq;
        public string da;
        public string di;
        public string data;
        public string versionString;

        public C02H(string receiveMsg)
        {
            c = GetC(receiveMsg);
            concentrator = GetConcentrator(receiveMsg);
            addressDomain = GetAddressDomain(receiveMsg);
            seq = GetSeq(receiveMsg);
            da = GetDA(receiveMsg);
            di = GetDI(receiveMsg);
            if (di.Equals("001000E0"))
            {
                data = GetData(receiveMsg);
                versionString = GetversionString(receiveMsg);
            }
            else
            {
                data = null; versionString = null;
            }
        }

        /// <summary>
        /// 根据类型，分别对登陆，心跳，登出。 生成对应应答报文 seq =rseq
        /// </summary>
        /// <returns></returns>
        public string CreateAnswerMsg()
        {
            //return C02HEncode.createAnswerMsg(c, concentrator, seq, da, di, data);
            //生成c
            C tempC = new C(c);
            tempC.dir = 0;//主站发出的下行报文
            tempC.prm = 0;//从动
            tempC.funcCode = 11;//对应PRM=1，链路层功能码=09的确认/否认
            string c_block = tempC.encodeC();
            //生成seq
            Seq tempSeq = new Seq(seq);
            tempSeq.con = 0;//不确认
            string seq_block = tempSeq.encodeSeqString();
            //其他

            string concentrator_block = addressDomain;
            string afn_block = "00";
            string da_block = da;
            string di_block = "000000E0";//全部确定/否定
            string data_block = "00";//肯定
            //
            string length_block = BaseEncoder.CalcLength(c_block + concentrator_block + afn_block + seq_block + da_block + di_block + data_block);
            string cs_block = BaseEncoder.CalcCSCode(Formater.HexStringToBytesKeep(c_block + concentrator_block + afn_block + seq_block + da_block + di_block + data_block)).ToString("X2");
            return "68" + length_block + length_block + "68" + c_block + concentrator_block + afn_block + seq_block + da_block + di_block + data_block + cs_block + "16";
        }

        private string GetC(string msg)
        {
            return BaseDecoder.GetC(msg);
        }
        private string GetConcentrator(string msg)
        {
            return BaseDecoder.GetConcentrator(msg);
        }
        private string GetAddressDomain(string msg)
        {
            return BaseDecoder.GetAddressDomain(msg);
        }
        private string GetSeq(string msg)
        {
            return BaseDecoder.GetSEQ(msg);
        }
        private string GetDA(string msg)
        {
            return msg.Substring(32, 4);
        }
        private string GetDI(string msg)
        {
            return msg.Substring(36, 8);
        }
        private string GetData(string msg)//登陆帧才有data
        {
            return msg.Substring(44, 4);
        }
        private string GetversionString(string msg)//登陆帧才有data
        {
            return Formater.ReverseHexString(GetData(msg));
        }
    }
}
